#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e3+10,INF=0x3f3f3f3f;
int m,s,t,head[MAXN],cnt,dis[MAXN];
bool vis[MAXN];
struct edge
{
	int v,next,val;
}e[MAXN*MAXN];
void addedge(int x,int y,int z)
{
	e[++cnt]=(edge){y,head[x],z};
	head[x]=cnt;
	return;
}
void SPFA()
{
	vis[0]=true;
	queue<int>q;
	q.push(0);
	dis[0]=0;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		vis[u]=false;
		for(int i=head[u];i;i=e[i].next)
		{
			int v=e[i].v;
			if(dis[v]>dis[u]+e[i].val)
			{
				dis[v]=dis[u]+e[i].val;
				if(!vis[v])
				{
					vis[v]=true;
					q.push(v);
				}
			}
		}
	}
	return;
}
int main()
{
	while(scanf("%d%d%d",&m,&s,&t)==3)
	{
		memset(head,0,sizeof(head));
		memset(vis,0,sizeof(vis));
		memset(dis,0x3f3f3f3f,sizeof(dis));
		cnt=0;
		for(int i=1;i<=m;++i)
		{
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			addedge(x,y,z);
			addedge(y,x,z);
		}
		for(int i=1;i<=s;++i)
		{
			int x;
			scanf("%d",&x);
			addedge(0,x,0);
		}
		SPFA();
		int _min=INF;
		for(int i=1;i<=t;++i)
		{
			int x;
			scanf("%d",&x);
			_min=min(_min,dis[x]);
		}
		printf("%d\n",_min);
	}
	return 0;
}
